import tool.TreeNode;
import tool.TreeNodePrint;
import tool.input;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * @Description: 二叉树的层平均值
 * 给定一个非空二叉树的根节点 root ,
 * 以数组的形式返回每一层节点的平均值。
 * 与实际答案相差 10-5 以内的答案可以被接受。
 * @Date:Create in 21:46  2022/7/19
 */
public class averageOfLevels637 {

    public static void main(String[] args) {
        String s = "[3,9,20,null,null,15,7]";
        TreeNode root = input.getTree(s);
        TreeNodePrint.printTree(root);
        List<Double> res = averageOfLevels(root);
        System.out.println(res.toString());
    }

    public static List<Double> averageOfLevels(TreeNode root) {
        List<Double> res = new ArrayList<>();
        if(root==null) return res;
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while(!que.isEmpty()){
            int len = que.size();
            double sum = 0,size = que.size();
            while(len>0){
                TreeNode node = que.poll();
                sum += node.val;
                if(node.left!=null) que.offer(node.left);
                if(node.right!=null) que.offer(node.right);
                len--;
            }
            double mean = sum/size;
            res.add(mean);
        }
        return res;
    }
}
